为whisper增加热词能力 给openAI的一次mr
问题起因
在语音到文字的转录过程中,经常遇到一些领域专有词汇或新出现的词汇,而 Whisper 往往不能正确的处理它们。
方案选择
我寻找了解决方案,在社区中有两种想法:
微调模型: 这种方法在每次出现新术语时去微调模型是成本高昂且不够及时。特别是在AI这样每天都有新事物出现的领域。
2. 使用--initial_prompt: 但 --initial_prompt 只适用于第一个音频窗口。如果专有词汇不在开始部分出现,这种方法是无效的。
以下是社区对这一问题的讨论情况:
在回顾其他转录模型时,使用热词是常见的做法。所以,我准备在Whisper中实现这个热词功能。我的方法是在每个转录窗口之前添加热词提示。经过测试,它确实解决了领域专有词汇的或新出现的词汇识别错误的问题。
解决效果:
首先我们看看结果对比,下面是对一个关于ComfyUI (ComfyUI是目前AI绘图领域1个非常常用的工具)的视频的转录。
未添加热词前:
添加热词后:
可以看到由于whisper在训练的时候还没有comfyUI这个词,所以当音频中出现comfyUI对应的音频信号时,会被识别为Conf UI 但在经过我们的热词处理后,完美识别出了comfyUI.
如何使用
在使用的时候添加 hotwords
参数,参数内容填入热词即可。
eg : hotwords="the video is about comfyUI”
方案细节
然后再看看如何具体这个问题的
要想解决这个问题,我们需要了解 1.whisper的模型结构 2.whisper的代码
whisper的模型结构
上面的图是Whisper的模型结构,可以看到是1个标准的encoder-decoder transformer结构,音频信号经过encoder 然后使用cross attention的方式传入decoder, decoder会将一些预设的token与encoder 传过来的数据作为输入,进行token预测。这里补充一点whisper是将音频拆分为1个个window 进行预测。
从上面的结构拆解中,可以看到决定音频预测的是decoder部分,在不改动模型的情况下,我们可以做的是改动decoder的输入部分,encoder传入的数据由encoder和音频信号决定不可更改,那么只能改动预设的token输入。
思路有了,那我们看看whisper的具体代码
whisper的代码结构
whisper的代码结构还是很简单的,transcibe是入口代码 decoder具体逻辑在decoding 中。
核心的代码改动其实只要这些
简单解释下,这里我们将我们的热词与原始的prompt拼接传给decoder,原始的prompt是什么呢?主要有2种情况:
1.如果是第1个window, 那么原始的prompt就是我们设置的--initial_prompt参数值
2.如果不是第1个window,那么原始的prompt就是上一个window转录结果,当然这个prompt长度是有限制的,所以会截取上一个window的最后部分,这样做也是通过添加上下文来增强转录的准确性。
至此,我们为whisper添加热词的功能就完成了。
总结
whisper 作为目前ASR领域目前比较成熟的模型,是标准的transformer encoder-decoder结构,其中使用到了cross attention,可以作为我们了解transformer的不错选择。了解原理从来不是为了重复造轮子,而是帮助更好地使用,当我们发现问题时可以着手解决。我们通过了解Whisper的内部原理成功解决了Whisper无法识别领域专有词汇或新出现的词汇的问题。